<?php
require_once "@AppFrame/Aliyun/Sms/SignatureHelper.php";
use Aliyun\DySDKLite\SignatureHelper;

/**
 * 取得给定日期所在周的开始日期和结束日期
 * @param string $gdate 日期，默认为当天，格式：YYYY-MM-DD
 * @param int $weekStart 一周以星期一还是星期天开始，0为星期天，1为星期一
 * @return array 数组array( "开始日期 ",  "结束日期");
 */
function getAWeekTimeSlot($gdate = '', $weekStart = 0) {
    if (! $gdate){
        $gdate = date ( "Y-m-d" );
    }
    $w = date ( "w", strtotime ( $gdate ) ); //取得一周的第几天,星期天开始0-6
    $dn = $w ? $w - $weekStart : 6; //要减去的天数
    $st = date ( "Y-m-d", strtotime ( "$gdate  - " . $dn . "  days " ) );
    $en = date ( "Y-m-d", strtotime ( "$st  +6  days " ) );
    return array ($st, $en ); //返回开始和结束日期
}

/**
 * 校验日期格式是否正确
 *
 * @param string $date 日期
 * @param string $formats 需要检验的格式数组
 * @return boolean
 */
function checkDateIsValid($date, $formats = array("Y-m-d", "Y/m/d")) {
    $unixTime = strtotime($date);
    if (!$unixTime) { //strtotime转换不对，日期格式显然不对。
        return false;
    }

    //校验日期的有效性，只要满足其中一个格式就OK
    foreach ($formats as $format) {
        if (date($format, $unixTime) == $date) {
            return true;
        }
    }

    return false;
}

/**
 * 重命名数组键值
 * @param mixed $arrInput 
 * @param mixed $arrNewKeyName 新键名数组
 */
function remap_array_keys($arrInput,$arrNewKeyName)
{
    // 每个数组都执行指定函数
    array_walk($arrInput, 'remap_array_keys_subfunction', $arrNewKeyName);
}
function remap_array_keys_subfunction($value,$key,$arrNewKeyName)
{
    // array_slice($v, 1, -1) 剔除数组中的某个值
    // 数组进行合并,前面是键值,后面是值
    $value = array_combine($arrNewKeyName,$value);
}

/**
 * 将数据库时间格式化为输出日期格式
 * @param mixed $dbDateStr 
 * @return mixed
 */
function DbDateFormat($dbDateStr){
    if($dbDateStr==null)return "";
    if($dbDateStr =="")return "";
    return date_format(date_create($dbDateStr),"Ymd");
}

/**
 * 将数据库时间格式化为输出时间格式
 * @param mixed $dbDateStr 
 * @return mixed
 */
function DbTimeFormat($dbDateStr){
    if($dbDateStr==null)return "";
    if($dbDateStr =="")return "";
    return date_format(date_create($dbDateStr),"YmdHis");
}
/**
 * 显示让APP重新登录的界面
 */
function ShowJsonLoginAndDie(){
    header("Content-type: text/html; charset=utf-8");
    $iErrType =1;
    die(json_encode(array(
         "errType"=>$iErrType, 
         "errInfo"=>"",
         "data"=>""
         )));
}
/**
 * 获取返回信息
0代表请求正常，解析data
1代表重新登录
2代表升级
3代表错误 
4代表更新接口地址
 * @return bool|\stdClass 返回API接口调用结果，当发生错误时返回false
 */
function ShowJsonReturnAndDie($arrData,$bHasError=false,$strErrorInfo=""){
    header("Content-type: text/html; charset=utf-8");
    $iErrType = $bHasError?3:0;
    $strPostPrompt=$_POST==null?"无提交":"有提交数据";
    die(json_encode(array(
        "postdata"=>$_POST,
         "errType"=>$iErrType, 
         "errInfo"=>$strErrorInfo,
         "data"=>$arrData
         ),JSON_UNESCAPED_UNICODE));
}
    /**
     * 加密解密码
     * @param mixed $string 
     * @param mixed $operation  D解密 E加密
     * @param mixed $key 
     * @return mixed
     */
    function anniEncrypt($string,$operation,$key=''){ 
        $operation = trim(strtoupper(trim($operation)));
        $key=$key."make key longger by dengchang"; //把密码加长防止逆向解密
        $key=md5($key); 
        $key_length=strlen($key); 
        $string=$operation=='D'?base64_decode($string):substr(md5($string.$key),0,8).$string; 
        $string_length=strlen($string); 
        $rndkey=$box=array(); 
        $result=''; 
        for($i=0;$i<=255;$i++){ 
            $rndkey[$i]=ord($key[$i%$key_length]); 
            $box[$i]=$i; 
        } 
        for($j=$i=0;$i<256;$i++){ 
            $j=($j+$box[$i]+$rndkey[$i])%256; 
            $tmp=$box[$i]; 
            $box[$i]=$box[$j]; 
            $box[$j]=$tmp; 
        } 
        for($a=$j=$i=0;$i<$string_length;$i++){ 
            $a=($a+1)%256; 
            $j=($j+$box[$a])%256; 
            $tmp=$box[$a]; 
            $box[$a]=$box[$j]; 
            $box[$j]=$tmp; 
            $result.=chr(ord($string[$i])^($box[($box[$a]+$box[$j])%256])); 
        } 
        if($operation=='D'){ 
            if(substr($result,0,8)==substr(md5(substr($result,8).$key),0,8)){ 
                return substr($result,8); 
            }else{ 
                return''; 
            } 
        }else{ 
            return str_replace('=','',base64_encode($result)); 
        } 
    }

    function MwithNoPrefix($strTableName)
    {
         // $strTableName 中大小写表名有区别
        return M(strtolower($strTableName)," "); //原有 M("xxx")带下划线无前缀会导致无法取得列名
    }

     /**
     * 发送短信
     *
     * @return bool|\stdClass 返回API接口调用结果，当发生错误时返回false
     */
    function sendAliyunSms($strPhone,$strSmsTemplate,$arrSmsWord) {

    $product = "Dysmsapi";//短信API产品名称（短信产品名固定，无需修改）
    $domain = "dysmsapi.aliyuncs.com";//短信API产品域名（接口地址固定，无需修改）
    $accessKeyId = "vQa8lz72UsYrSmXC";//你的accessKeyId，参考本文档步骤2
    $accessKeySecret = "zlnwWumGOysmLgWPRhsh79S5EN6uC7";//你的accessKeySecret，参考本文档步骤2
    $strSignName = "安妮教育";
    $params = array ();

    // *** 需用户填写部分 ***

    // fixme 必填: 请参阅 https://ak-console.aliyun.com/ 取得您的AK信息
    // $accessKeyId = "your access key id";
    //$accessKeySecret = "your access key secret";

    // fixme 必填: 短信接收号码
    $params["PhoneNumbers"] = $strPhone;

    // fixme 必填: 短信签名，应严格按"签名名称"填写，请参考: https://dysms.console.aliyun.com/dysms.htm#/develop/sign
    $params["SignName"] = $strSignName;

    // fixme 必填: 短信模板Code，应严格按"模板CODE"填写, 请参考: https://dysms.console.aliyun.com/dysms.htm#/develop/template
    $params["TemplateCode"] = $strSmsTemplate;

    // fixme 可选: 设置模板参数, 假如模板中存在变量需要替换则为必填项
    /*
    $params['TemplateParam'] = Array (
    "code" => "12345",
    "product" => "阿里通信"
    );*/
    $params['TemplateParam'] = $arrSmsWord;

    // fixme 可选: 设置发送短信流水号
    //$params['OutId'] = "12345";

    // fixme 可选: 上行短信扩展码, 扩展码字段控制在7位或以下，无特殊需求用户请忽略此字段
    //$params['SmsUpExtendCode'] = "1234567";


    // *** 需用户填写部分结束, 以下代码若无必要无需更改 ***
    if(!empty($params["TemplateParam"]) && is_array($params["TemplateParam"])) {
        $params["TemplateParam"] = json_encode($params["TemplateParam"], JSON_UNESCAPED_UNICODE);
    }
    // 初始化SignatureHelper实例用于设置参数，签名以及发送请求
    $helper = new SignatureHelper();

    // 此处可能会抛出异常，注意catch
    $content = $helper->request(
        $accessKeyId,
        $accessKeySecret,
        "dysmsapi.aliyuncs.com",
        array_merge($params, array(
            "RegionId" => "cn-hangzhou",
            "Action" => "SendSms",
            "Version" => "2017-05-25",
        ))
    );

    return $content;
}
    /**
     * 格式化数值，被Json数字为空的时候，小数点前头无零的情况
     * @param mixed $strInput 
     */
    function qwFormatData($numInput)
    {
        if($numInput==null)$numInput=0;
        return number_format($numInput,2);
    }

    /*
     * array_column() 返回输入数组中某个单一列的值。
     */
    function i_array_column($input, $columnKey, $indexKey=null){
        if(!function_exists('array_column')){
            $columnKeyIsNumber  = (is_numeric($columnKey))?true:false;
            $indexKeyIsNull            = (is_null($indexKey))?true :false;
            $indexKeyIsNumber     = (is_numeric($indexKey))?true:false;
            $result                         = array();
            foreach((array)$input as $key=>$row){
                if($columnKeyIsNumber){
                    $tmp= array_slice($row, $columnKey, 1);
                    $tmp= (is_array($tmp) && !empty($tmp))?current($tmp):null;
                }else{
                    $tmp= isset($row[$columnKey])?$row[$columnKey]:null;
                }
                if(!$indexKeyIsNull){
                    if($indexKeyIsNumber){
                        $key = array_slice($row, $indexKey, 1);
                        $key = (is_array($key) && !empty($key))?current($key):null;
                        $key = is_null($key)?0:$key;
                    }else{
                        $key = isset($row[$indexKey])?$row[$indexKey]:0;
                    }
                }
                $result[$key] = $tmp;
            }
            return $result;
        }else{
            return array_column($input, $columnKey, $indexKey);
        }
    }
    
    
    function    qwTrimStr($strVal){
        if($strVal==null)return "";
        return trim($strVal);
    }
?>